const express = require('express')
const router = express.Router()
const mongoose = require('mongoose')
const Good = require('../models/good')
const User = require('./../models/user')

const priceFilter = [
  {
    floor: 0,
    ceiling: 100
  },
  {
    floor: 100,
    ceiling: 500
  },
  {
    floor: 500,
    ceiling: 1000
  },
  {
    floor: 1000,
    ceiling: 2000
  },
  {
    floor: 2000,
    ceiling: 5000
  }
]

// 连接 MongoDB 数据库
mongoose.connect('mongodb://127.0.0.1:27017/mi-mall')

const db = mongoose.connection
// 监听连接状态
db.on('open', () => {
  console.log('open mongodb connection')
})
db.on('connneted', () => {
  console.log('MongoDB connect success')
})
db.on('error', () => {
  console.log('MongoDB connect failed')
})
db.on('disconnected', () => {
  console.log('MongoDB disconnected')
})

// 分页获取商品列表页面
// 每页获取商品数量为8个
// 默认排序方式：按照商品价格升序排列
router.get('/list', (req, res, next) => {
  let page = parseInt(req.query['page'])
  let pageSize = parseInt(req.query['pageSize'])
  let sort = req.query['sort']
  let priceLevel = req.query['priceLevel']
  let skipNum = (page - 1) * pageSize

  let params = priceLevel === 'all' ? {} : {
    salePrice: {
      $gt: priceFilter[priceLevel].floor,
      $lte: priceFilter[priceLevel].ceiling
    }
  }
  Good.find(params)
    .skip(skipNum)
    .limit(pageSize)
    .sort({salePrice: sort})
    .exec()
    .then(goods => {
      res.json({
        status: '0',
        msg: '',
        result: {
          list: goods
        }
      })
    })
    .catch(err => {
      res.json({
        status: '1',
        msg: err.message
      })
    })
})

// 将商品加入到购物车
router.post('/addToCart', (req, res, next) => {
  const userId = req.cookies['userId']
  const productId = req.body.productId
  let good = ''
  // 找到目标 ID 的商品
  Good.findOne({ productId })
  /**
   * Mongoose API: findone({}).then(res => { // process result }, err => { // handle error })
   * 当出现错误时result为null，当查找成功时error为null */
    .then(result => {
      if (!result) {
        res.json({
          status: '1',
          msg: `本商城内未找到id:${productId}的商品`,
          result: ''
        })
        return
      }
      // 如果result 不为 null，表示该 id 是合法的
      // 进一步判断, 该 id 商品是否已经在用户的 cartList 内
      // 是则将商品数量增 1， 否则追加该商品条目
      User.updateOne(
        { 'cartList.productId': productId },
        {
          $inc: { 'cartList.$.productNum': 1 },
          $set: { 'cartList.$.checked': '1' }
        }
      )
        .then(result => {
          if (result.nModified) {
            // 找到合法 id 的商品并且存在于该用户的购物车中
            // 并且已经更新商品 checked 和 productNum 字段
            // 需要将 good 置空
            res.json({
              status: '0',
              msg: '该用户购物车内已有该商品，数量已经增加 1',
              result: result
            })
            good = ''
          }
          // 如果 good 不为空，说明该用户购物车内没有该商品
          // 插入该商品到该用户的购物车
          if (good) {
            User.updateOne(
              { userId },
              { $push: { cartList: good } }
            )
              .then(result => {
                res.json({
                  status: '0',
                  msg: '该用户购物车内没有该商品，已经添加进购物车',
                  result: result
                })
              })
          }
        })
      result.checked = '1'
      result.productNum = 1
      good = result
    })
    .catch(err => {
      res.json({
        msg: `error: ${err.message}`
      })
    })
})

module.exports = router
